{
 "cells": [
  {
   "cell_type": "code",
   "id": "initial_id",
   "metadata": {
    "collapsed": true,
    "ExecuteTime": {
     "end_time": "2025-11-05T09:09:04.199598Z",
     "start_time": "2025-11-05T09:09:04.195480Z"
    }
   },
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ],
   "outputs": [],
   "execution_count": 75
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-11-05T09:09:04.211065Z",
     "start_time": "2025-11-05T09:09:04.206508Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 准备数据\n",
    "X = np.array([[2, 1], [3, 1], [1, 4], [2, 6]])\n",
    "# 分类标签\n",
    "y = np.array([0, 1, 0, 1])"
   ],
   "id": "79a03b67a7d238c9",
   "outputs": [],
   "execution_count": 76
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-11-05T09:09:04.230361Z",
     "start_time": "2025-11-05T09:09:04.221351Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 定义 KNN 分类模型\n",
    "knn = KNeighborsClassifier(n_neighbors=2, weights='distance')\n",
    "knn.fit(X, y)"
   ],
   "id": "a92aedc3798bf25a",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KNeighborsClassifier(n_neighbors=2, weights='distance')"
      ],
      "text/html": [
       "<style>#sk-container-id-15 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: #000;\n",
       "  --sklearn-color-text-muted: #666;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-15 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-15 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-15 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-15 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-15 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-15 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-15 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-15 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-15 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-15 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-15 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-15 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-15 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-15 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-15 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: flex;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "  align-items: start;\n",
       "  justify-content: space-between;\n",
       "  gap: 0.5em;\n",
       "}\n",
       "\n",
       "#sk-container-id-15 label.sk-toggleable__label .caption {\n",
       "  font-size: 0.6rem;\n",
       "  font-weight: lighter;\n",
       "  color: var(--sklearn-color-text-muted);\n",
       "}\n",
       "\n",
       "#sk-container-id-15 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-15 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-15 div.sk-toggleable__content {\n",
       "  display: none;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-15 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-15 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-15 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-15 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  overflow: visible;\n",
       "}\n",
       "\n",
       "#sk-container-id-15 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-15 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-15 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-15 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-15 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-15 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-15 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-15 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-15 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-15 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-15 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-15 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-15 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-15 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-15 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 0.5em;\n",
       "  text-align: center;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-15 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-15 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-15 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-15 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".estimator-table summary {\n",
       "    padding: .5rem;\n",
       "    font-family: monospace;\n",
       "    cursor: pointer;\n",
       "}\n",
       "\n",
       ".estimator-table details[open] {\n",
       "    padding-left: 0.1rem;\n",
       "    padding-right: 0.1rem;\n",
       "    padding-bottom: 0.3rem;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table {\n",
       "    margin-left: auto !important;\n",
       "    margin-right: auto !important;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:nth-child(odd) {\n",
       "    background-color: #fff;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:nth-child(even) {\n",
       "    background-color: #f6f6f6;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:hover {\n",
       "    background-color: #e0e0e0;\n",
       "}\n",
       "\n",
       ".estimator-table table td {\n",
       "    border: 1px solid rgba(106, 105, 104, 0.232);\n",
       "}\n",
       "\n",
       ".user-set td {\n",
       "    color:rgb(255, 94, 0);\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       ".user-set td.value pre {\n",
       "    color:rgb(255, 94, 0) !important;\n",
       "    background-color: transparent !important;\n",
       "}\n",
       "\n",
       ".default td {\n",
       "    color: black;\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       ".user-set td i,\n",
       ".default td i {\n",
       "    color: black;\n",
       "}\n",
       "\n",
       ".copy-paste-icon {\n",
       "    background-image: url();\n",
       "    background-repeat: no-repeat;\n",
       "    background-size: 14px 14px;\n",
       "    background-position: 0;\n",
       "    display: inline-block;\n",
       "    width: 14px;\n",
       "    height: 14px;\n",
       "    cursor: pointer;\n",
       "}\n",
       "</style><body><div id=\"sk-container-id-15\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KNeighborsClassifier(n_neighbors=2, weights=&#x27;distance&#x27;)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-15\" type=\"checkbox\" checked><label for=\"sk-estimator-id-15\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>KNeighborsClassifier</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.7/modules/generated/sklearn.neighbors.KNeighborsClassifier.html\">?<span>Documentation for KNeighborsClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"\">\n",
       "        <div class=\"estimator-table\">\n",
       "            <details>\n",
       "                <summary>Parameters</summary>\n",
       "                <table class=\"parameters-table\">\n",
       "                  <tbody>\n",
       "                    \n",
       "        <tr class=\"user-set\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('n_neighbors',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">n_neighbors&nbsp;</td>\n",
       "            <td class=\"value\">2</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"user-set\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('weights',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">weights&nbsp;</td>\n",
       "            <td class=\"value\">&#x27;distance&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('algorithm',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">algorithm&nbsp;</td>\n",
       "            <td class=\"value\">&#x27;auto&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('leaf_size',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">leaf_size&nbsp;</td>\n",
       "            <td class=\"value\">30</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('p',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">p&nbsp;</td>\n",
       "            <td class=\"value\">2</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('metric',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">metric&nbsp;</td>\n",
       "            <td class=\"value\">&#x27;minkowski&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('metric_params',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">metric_params&nbsp;</td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('n_jobs',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">n_jobs&nbsp;</td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "                  </tbody>\n",
       "                </table>\n",
       "            </details>\n",
       "        </div>\n",
       "    </div></div></div></div></div><script>function copyToClipboard(text, element) {\n",
       "    // Get the parameter prefix from the closest toggleable content\n",
       "    const toggleableContent = element.closest('.sk-toggleable__content');\n",
       "    const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : '';\n",
       "    const fullParamName = paramPrefix ? `${paramPrefix}${text}` : text;\n",
       "\n",
       "    const originalStyle = element.style;\n",
       "    const computedStyle = window.getComputedStyle(element);\n",
       "    const originalWidth = computedStyle.width;\n",
       "    const originalHTML = element.innerHTML.replace('Copied!', '');\n",
       "\n",
       "    navigator.clipboard.writeText(fullParamName)\n",
       "        .then(() => {\n",
       "            element.style.width = originalWidth;\n",
       "            element.style.color = 'green';\n",
       "            element.innerHTML = \"Copied!\";\n",
       "\n",
       "            setTimeout(() => {\n",
       "                element.innerHTML = originalHTML;\n",
       "                element.style = originalStyle;\n",
       "            }, 2000);\n",
       "        })\n",
       "        .catch(err => {\n",
       "            console.error('Failed to copy:', err);\n",
       "            element.style.color = 'red';\n",
       "            element.innerHTML = \"Failed!\";\n",
       "            setTimeout(() => {\n",
       "                element.innerHTML = originalHTML;\n",
       "                element.style = originalStyle;\n",
       "            }, 2000);\n",
       "        });\n",
       "    return false;\n",
       "}\n",
       "\n",
       "document.querySelectorAll('.fa-regular.fa-copy').forEach(function(element) {\n",
       "    const toggleableContent = element.closest('.sk-toggleable__content');\n",
       "    const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : '';\n",
       "    const paramName = element.parentElement.nextElementSibling.textContent.trim();\n",
       "    const fullParamName = paramPrefix ? `${paramPrefix}${paramName}` : paramName;\n",
       "\n",
       "    element.setAttribute('title', fullParamName);\n",
       "});\n",
       "</script></body>"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 77
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-11-05T09:09:04.269468Z",
     "start_time": "2025-11-05T09:09:04.262519Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 预测结果值\n",
    "x = np.array([[4, 9]])\n",
    "x_class = knn.predict(x)\n",
    "print(x_class)"
   ],
   "id": "fee0e74ac5c2fdb",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1]\n"
     ]
    }
   ],
   "execution_count": 78
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-11-05T09:09:04.401703Z",
     "start_time": "2025-11-05T09:09:04.284246Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 画图\n",
    "# 使用布尔索引将两类点分开\n",
    "fig, ax = plt.subplots()\n",
    "ax.axis('equal')\n",
    "x1 = X[y == 0]\n",
    "x2 = X[y == 1]\n",
    "# 定义不同的颜色，画两组点\n",
    "colors = ['C0', 'C1']\n",
    "plt.scatter(x1[:, 0], x1[:, 1], c=colors[0])\n",
    "plt.scatter(x2[:, 0], x2[:, 1], c=colors[1])\n",
    "x_color = colors[0] if x_class == 0 else colors[1]\n",
    "plt.scatter(x[:, 0], x[:, 1], c=x_color)\n",
    "plt.show()"
   ],
   "id": "577cf7f9306edb95",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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ffjhhzFnzpy48sori+GQnamrqyuWrWpra1t6SACguxZv/uUvf4n33nsvzjvvvF3uV11dHZWVlduWqqqqlh4SAOjkykqlUqklbzz55JOjb9++8dBDD+1yvx31WKRwUVNTExUVFS05NADQztL1O3UQ7O763aKhkDfeeCMee+yx+POf/7zbfcvLy4sFAOj+WjQUMnv27Bg0aFBMnjw5f4sAgJ4TLBoaGopgce6550afPi2u/QQAuqFmB4s0BLJ69eq44IIL2qZFAECX1ewuhwkTJkQL6z0BgG7Os0IAgGwECwAgG8ECAMhGsAAAshEsAIBsBAsAIBvBAgDIRrAAALIRLACAbAQLACAbwQIAyEawAACyESwAgGwECwAgG8ECAMhGsAAAshEsAIBsBAsAIBvBAgDIRrAAALIRLAAAwQIA6Hz0WAAA2QgWAEA2ggUAkI1gAQBkI1gAANkIFgBANoIFAJCNYAEAZNMn30cBXUZDfcQbT0Rsejtir/0iho+L6NW7o1sF9MQei7Vr18bZZ58d++yzT/Tv3z8OPvjgWL58edu0DsjvhQcjfj424p6vRfzpwi0/03raDtCeweLdd9+NY489NvbYY4+YP39+vPDCC/Gzn/0s9t5779a2A2gPKTzcf05E7brG22vXb9kuXADtORQyc+bMqKqqitmzZ2/bNmLEiNa2AWiv4Y8FP4iI0g5eTNvKIhZcFTF6smERoH16LB588ME44ogj4owzzohBgwbFoYceGnfeeecu31NXVxe1tbWNFqADpJqK7XsqGilF1K7dsh9AewSL1157LWbNmhWf+9zn4pFHHomLL744Lrvssrjnnnt2+p7q6uqorKzctqQeD6ADpELNnPsB7EBZqVTaUb/oDvXt27fosXjiif/+jyYFi2XLlsWTTz650x6LtGyVeixSuKipqYmKioqmHhporVV/3VKouTvnPhwx4svON9BIun6nDoLdXb+b1WMxePDgGDNmTKNtBx54YKxevXqn7ykvLy8a8MkF6ADpltKKIVtqKXaoLKLiM1v2A2ihZgWLdEfISy+91Gjbyy+/HMOHD2/p8YH2kuapmDjzPyvbh4v/rE+coXATaL9gccUVV8TSpUvjhhtuiFdffTXmzp0bd9xxR0ydOrV1rQDax5ivR5z5m4iKwY23p56MtD29DtBeNRbJww8/HNOnT49XXnmluNX0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Dyt6Jj4praftnWYeizRPxZm/iajYrj2ppyJtN48FdFplpVJpR32NO7Vw4cI44YQT/mf7ueeeG3ffffdu35/uCklFnKneoqKionmtBbIw8ybQXE29fjc7WLSWYAEAXU9Tr99qLACAbAQLACAbwQIAyEawAACyESwAgGwECwAgG8ECAMhGsAAAshEsAICu83TT7W2d6DPN4AUAdA1br9u7m7C73YPFxo0bi59VVVXtfWgAIMN1PE3t3WmeFdLQ0BDr1q2LAQMGRFlZBz+euR3SXQpQa9as8cA157PT8f10Pjsz38/Odz5TXEihYsiQIdGrV6/O02ORGjN06NDoSdJfoie5Op+dle+n89mZ+X52rvO5q56KrRRvAgDZCBYAQDaCRRsqLy+Pn/zkJ8VPnM/OxvfT+ezMfD+77vls9+JNAKD70mMBAGQjWAAA2QgWAEA2ggUAkI1g0Q5ef/31uPDCC2PEiBHRv3//GDVqVFGd++GHH7bH4buF2267LQ444IDo169fHH300fHUU091dJO6pOrq6jjyyCOLmW8HDRoUp512Wrz00ksd3axuY8aMGcWMwtOmTevopnRZa9eujbPPPjv22Wef4vflwQcfHMuXL+/oZnVJ9fX1cfXVVze69lx77bW7fdZHa7X7zJs90YsvvlhMZX777bfHZz/72Xj++efjoosuis2bN8dNN93U0c3r9H7/+9/HlVdeGb/61a+KUPHzn/88Tj755OKCmC6ONN2iRYti6tSpRbj4+OOP44c//GFMmDAhXnjhhdhzzz2dylZYtmxZ8W/8kEMOcR5b6N13341jjz02TjjhhJg/f37su+++8corr8Tee+/tnLbAzJkzY9asWXHPPffEQQcdVAS0888/v5g987LLLou24nbTDnLjjTcWf+GvvfZaRzWhy0hhIl0Ib7311mI9hbQ05/2ll14aV111VUc3r0t75513inCWAsdxxx3X0c3psjZt2hSHHXZY/PKXv4zrrrsuvvjFLxYBmOZJ/57/9re/xV//+lenLoOvfe1rsd9++8Vdd921bdvpp59e9F7MmTMn2oqhkA5SU1MTAwcO7KjDdxlpuGjFihUxfvz4Rs+bSetPPvlkh7atu3wPE9/F1km9QJMnT270PaX5HnzwwTjiiCPijDPOKALvoYceGnfeeadT2ULjxo2Lxx9/PF5++eVi/bnnnoslS5bEpEmToi0ZCukAr776atxyyy2GQZrgn//8ZzFOmFL3J6X1NMREy6Wen1QLkLqex44d61S20H333RdPP/10MRRC66Qe3NSTm4Y+0zBdOqepy75v375x7rnnOr0t6AFKTzUdPXp09O7du/hdev3118eUKVOiLemxaOVfWirU2tWy/cUvFSZNnDixSOSpzgI68n/Zqd4nXRhpmfQI6ssvvzzuvffeorCY1ofdNKR0ww03FL0V3/72t4vfk6m+iua7//77i+/m3Llzi/Cbai1SXV/62Zb0WLTCd7/73TjvvPN2uc/IkSO3/XndunVFUVLqnrrjjjtac+ge49Of/nSRtN9+++1G29P6/vvv32Ht6uouueSSePjhh2Px4sUxdOjQjm5Ol5WG6TZs2FBcDLdK/ytM5zXVBNXV1RXfX5pm8ODBMWbMmEbbDjzwwPjTn/7kFLbA97///eI/wN/85jeL9XSHzRtvvFHcHdaWPUCCRSukiuW0NEXqqUih4vDDD4/Zs2cXdQLsXuoCTecsjROmWyO3/q8mraeLI82TbjNLRa/z5s2LhQsXFreh0XInnnhirFy5stG2VHWfup5/8IMfCBXNlIbltr/9OdUHDB8+3Ne0Bd5///3/udakoJt+h7YlwaIdpFDxla98pfjHkbqhUiX+Vv7XvXtpvDWl61TUddRRRxXV9ulW3fQLnOYPf6Ru0QceeKCYy+Ktt94qtqfbz1KlOM2TzuH29Snptt00B4O6lea74oorih7dNBRy5plnFvPVpN5dPbwtc8oppxQ1FcOGDStuN33mmWfi5ptvjgsuuCDaVHq6KW1r9uzZaTaSHS40zS233FIaNmxYqW/fvqWjjjqqtHTpUqeuBXb2PUzfUfI4/vjjS5dffrnT2UIPPfRQaezYsaXy8vLS6NGjS3fccYdz2UK1tbXFdzH97uzXr19p5MiRpR/96Eelurq6UlsyjwUAkI2BfgAgG8ECAMhGsAAAshEsAIBsBAsAIBvBAgDIRrAAALIRLACAbAQLACAbwQIAyEawAACyESwAgMjl/wNfvvPYEUwgfgAAAABJRU5ErkJggg=="
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {
      "display_id": null
     }
    }
   ],
   "execution_count": 79
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
